﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.Threading;

using SIMA.Interfaces;
//using SIMA.Entities;
using SIMA.Core.Data.Collection;
using SIMA.Core.Enums;


namespace SIMA.Server.Services
{
    [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)]
    public class UsuarioServer//:ServerBase,IUsuario
    {
        //#region Fields

        //private static List<IUsuarioCallback> subscribers = new List<IUsuarioCallback>();
        //private static SmartContainer<T_C_Usuario> usuariosSmart;
        //public ServiceHost host = null;

        //#endregion

        //#region Constructor

        //public UsuarioServer()
        //    : base()
        //{
        //    Init();
        //}

        //#endregion

        //#region Methods

        //#region Private Methods

        //private void Init()
        //{
        //    usuariosSmart = new SmartContainer<T_C_Usuario>(false,true);
        //    usuariosSmart.Inserted += new EventHandler<SIMA.Core.EventArgs.InsertedEventArgs>(usuariosSmart_Inserted);
        //    usuariosSmart.Deleted += new EventHandler<SIMA.Core.EventArgs.DeletedEventArgs>(usuariosSmart_Deleted);
        //    usuariosSmart.Updated += new EventHandler<SIMA.Core.EventArgs.UpdatedEventArgs>(usuariosSmart_Updated);
        //    usuariosSmart.Failed += new EventHandler<SIMA.Core.EventArgs.FailedEventArgs>(usuariosSmart_Failed);
        //}        

        //#endregion

        //#region Smart Conainer Event Implementation

        //void usuariosSmart_Failed(object sender, SIMA.Core.EventArgs.FailedEventArgs e)
        //{
        //    subscribers.ForEach(delegate(IUsuarioCallback callback)
        //    {
        //        if (((ICommunicationObject)callback).State == CommunicationState.Opened)
        //        {
        //            callback.OnError(e);
        //        }
        //        else
        //        {
        //            subscribers.Remove(callback);
        //        }
        //    });
        //}

        //void usuariosSmart_Updated(object sender, SIMA.Core.EventArgs.UpdatedEventArgs e)
        //{
        //    subscribers.ForEach(delegate(IUsuarioCallback callback)
        //    {
        //        if (((ICommunicationObject)callback).State == CommunicationState.Opened)
        //        {
        //            callback.OnUpdated(e);
        //        }
        //        else
        //        {
        //            subscribers.Remove(callback);
        //        }
        //    });
        //}

        //void usuariosSmart_Deleted(object sender, SIMA.Core.EventArgs.DeletedEventArgs e)
        //{
        //    subscribers.ForEach(delegate(IUsuarioCallback callback)
        //    {
        //        if (((ICommunicationObject)callback).State == CommunicationState.Opened)
        //        {
        //            callback.OnDeleted(e);
        //        }
        //        else
        //        {
        //            subscribers.Remove(callback);
        //        }
        //    });
        //}

        //void usuariosSmart_Inserted(object sender, SIMA.Core.EventArgs.InsertedEventArgs e)
        //{
        //    subscribers.ForEach(delegate(IUsuarioCallback callback)
        //    {
        //        if (((ICommunicationObject)callback).State == CommunicationState.Opened)
        //        {
        //            callback.OnInserted(e);
        //        }
        //        else
        //        {
        //            subscribers.Remove(callback);
        //        }
        //    });
        //}

        //#endregion

        //#region Override Methods

        //public override void Connect()
        //{
        //    using (ServiceHost host = new ServiceHost(typeof(UsuarioServer), new Uri("net.tcp://192.168.1.33:18500")))
        //    {
        //        host.AddServiceEndpoint(typeof(IUsuario), new NetTcpBinding(), "IUsuarioSubscription");
        //        try
        //        {
        //            host.Open();
        //            Thread.Sleep(500);
        //            Console.WriteLine("Iniciado el servicio de manejo de usuarios ... OK");
        //        }
        //        catch (Exception ex)
        //        {
        //            Console.WriteLine(ex.Message);
        //        }
        //    }
        //}

        //#endregion

        //#region Public Methods

        //public void InsertUsuario(T_C_Usuario perfil)
        //{
        //    throw new NotImplementedException();
        //}

        //public void UpdateUsuario(T_C_Usuario perfilToUpdate, SIMA.Entities.T_C_Usuario perfilUpdated)
        //{
        //    throw new NotImplementedException();
        //}

        //public void DeleteUsuario(T_C_Usuario perfil)
        //{
        //    throw new NotImplementedException();
        //}

        //public void SelectSpecilized(string query, CommandType queryType)
        //{
        //    throw new NotImplementedException();
        //}

        //#endregion

        //#region Subscription

        //public bool Subscribe()
        //{
        //    try
        //    {
        //        IUsuarioCallback callback = OperationContext.Current.GetCallbackChannel<IUsuarioCallback>();
        //        if (!subscribers.Contains(callback))
        //        {
        //            subscribers.Add(callback);
        //        }
        //        return true;
        //    }
        //    catch
        //    {
        //        return false;
        //    }

        //}

        //public bool Unsubscribe()
        //{
        //    try
        //    {
        //    IUsuarioCallback callback = OperationContext.Current.GetCallbackChannel<IUsuarioCallback>();
        //    if (subscribers.Contains(callback))
        //    {
        //        subscribers.Remove(callback);
        //    }
        //    return true;
        //    }
        //    catch
        //    {
        //        return false;
        //    }
        //}

        //#endregion

        //#endregion       
    }
}
